package 反射;

import IO流.字节.字节输出流FileOutputStream;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;
import java.util.Arrays;

public class 获取类中的构造方法 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //1.获取class类的字节码文件
        Class<?> aClass = Class.forName("反射.Student");

        //2.通过类的字节码文件获取类中的构造方法
        //获取工公共的构造方法
        Constructor<?>[] con1 = aClass.getConstructors();
        for (Constructor<?> con : con1) {
            System.out.println(con);
        }

        //获取是全部的构造方法
        Constructor<?>[] allcon = aClass.getDeclaredConstructors();

        //获取指定的构造方法
        Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class);

        Constructor<?> dec = aClass.getDeclaredConstructor(String.class, int.class);

        //获取构造方法的权限修饰符,返回这个修饰符对应的数值.
        int modifiers = dec.getModifiers();

        //获取构造方法参数的个数
        int parameterCount = dec.getParameterCount();
        System.out.println(parameterCount);
        //获取到构造方法的每一个参数的类型,并且返回到数组中.
        Class<?>[] parameterTypes = dec.getParameterTypes();
        System.out.println(Arrays.toString(parameterTypes));

        //获取构造方法的每一个参数
        Parameter[] parameters = dec.getParameters();
        System.out.println(Arrays.toString(parameters));

        //利用构造方法创建类对象
        //临时取消权限检验
        dec.setAccessible(true);
        Student stu = (Student)dec.newInstance("张三", 23);
        System.out.println(stu);//Student{name = 张三, age = 23}

    }
}
